import axios from "axios"
import store from '@/store'
import jsonBig from 'json-bigint'
import router from '@/router'
import { refreshTokenAPI } from '@/api'

// const { token } = store.state
// console.log(token);
// axios.defaults.baseURL = "http://api-toutiao-web.itheima.net"
const request = axios.create({
  // baseURL: "http://api-toutiao-web.itheima.net"// 基础路径
  baseURL: "http://geek.itheima.net",
  //对axios响应返回回来的数据进行处理  大数字 
  transformResponse: [function (data) {
    // 对 data 进行任意转换处理
    try {
      return jsonBig.parse(data)
    } catch (error) {
      return data;  //JSON.parse(data)
    }
  }]
})
// 添加请求拦截器
request.interceptors.request.use(function (config) {
  //在headers中统一添加token
  //如果存在有token，就进行添加
  // 存放refresh_token
  /* if (config.isRefreshToken) {
    config.headers['Authorization'] = `Bearer ${token.token}`
  } */
  const { token } = store.state
  // console.log(token);
  if (token?.token) {
    config.isRefreshToken ? config.headers['Authorization'] = `Bearer ${token.refresh_token}` : config.headers['Authorization'] = `Bearer ${token.token}`
  }
  /* if (token?.token && !config.isRefreshToken) {
    config.headers['Authorization'] = `Bearer ${token.token}`
  } else if (config.isRefreshToken) {
    config.headers['Authorization'] = `Bearer ${token.refresh_token}`
  } */
  return config
}, function (err) {
  return Promise.reject(err)
})

request.interceptors.response.use(response => {
  return response
}, async err => {
  console.log(err);
  // 请求失败，判断是否是因为token过期导致的
  if (err.response?.status === 401) {
    const { token } = store.state
    // console.log(token);
    // 此时请求拦截器失败的原因是因为token过期或无效，应该使用refresh_token获取最新的token
    // 查看是否有 refresh_token，如果没有则需要直接跳到登录页面
    if (token?.refresh_token) {
      // debugger
      // 调用刷新Token的接口
      const { data: { data } } = await refreshTokenAPI()
      // 刷新成功之后，需要将最新的token进行重新保存，不能直接将token传过去，而是应该带上refresh_token传过去
      // console.log({ ...store.state.token, token: data.token });
      store.commit('updateToken', { ...token, token: data.token })
      // token更新完成之后，需要重新发送上一次的请求
      // 此处一定要return ，将上次的请求重新发出去，在上次请求的地方会获取这个请求的值，如果不return，则是获得undefined
      return request(err.config)
    } else {
      router.push({ name: 'login' })
    }

  } else {
    return Promise.reject(err.message)
  }
})

export default request